package main

import (
	"bufio"
	"fmt"
	"io"
	"strings"
)

// 函数是一等公民:参数，变量，返回值都可以是函数
// 闭包：函数体 -> 局部变量 自由变量

func fibonacci() intGen {
	a, b := 0, 1
	return func() int {
		a, b = b, a+b
		return a
	}
}

type intGen func() int

func (i intGen) Read(p []byte) (n int, err error) {
	next := i()
	if next > 1000 {
		return 0, io.EOF
	}
	s := fmt.Sprintf("%d\n", next)
	return strings.NewReader(s).Read(p)
}

func printFileContents(reader io.Reader) {
	scanner := bufio.NewScanner(reader)
	for scanner.Scan() {
		fmt.Println(scanner.Text())
	}
}

func main() {
	f := fibonacci()
	printFileContents(f)
}
